home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
tool
/
select
/
select.008
< prev
next >
Wrap
Text File
|
1995-02-16
|
6KB
|
268 lines
/*
r.m=80 tab=4
=======================================================================
== <<バッチ分岐支援プログラム>> ==
== [ select.exe ] Ver 0.08 ==
== 1995 Program : Y.Gotoh ==
=======================================================================
*/
/*外部ファイル読み込み */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include <gds.h>
#include "gotoh.h"
/* グローバル変数の設定 */
char *wp; /* GDSで使うワークアドレス */
char *sel[20]; /* select群で使用 */
int end_echo=1; /* エンディングエコーの表示非表示。初期(1)は表示 */
char *help={
"\n"
" \"select.exe\" Ver 0.08 1995 : Y.Gotoh (Gori)\n"
"\n"
" select.exe [option] title sel_1 sel_b sel_c ・・・\n"
" /h ・・・ Help ヘルプを表示します.\n"
" /e ・・・ not Eending echo 終了時メッセージを表示しません.\n"
" /b[r][g][b] ・・・ Back color [r],[g],[b]で背景を塗ります.\n"
"\n"
" ==メニューの使い方==\n"
" [↑],[F],[f] ・・・・・・・・・・ カーソルを上へ移動\n"
" [↓],[J],[j] ・・・・・・・・・・ 〃 下 〃 \n"
" [ret],[space] ・・・・・・・・・・ 決定\n"
" [0~9] ・・・・・・・・・・ その番号のメニューを実行\n"
" [esc],[Q],[q] ・・・・・・・・・・ 終了\n\n"
};
/* 関数の定義 */
void waitkey( int wait_time);
void HELP( void );
int select(int sel_max);
void select_list(int sel_max);
void select_prt(int sel_no,int sel_bak);
/* メイン */
int main(int argc , char *argv[])
{
/* 初期設定 */
int ret,sel_max=-1,i,j; /* sel_maxは後の所で修正されるため初期値 */
/* は(-1)とする */
int pal[3]={0,0,0}; /* 背景パレット */
char dmy; /* 雑用char*/
/* GDS使用定義 */
wp=GDS_init(100); /* wpはGDSワークアドレス変更禁止 */
/* 画面消去 */
txt_cls();
GDS_write_page(1); /* page1を使用 */
GDS_display_page(1);
GDS_all_clear();
/* タイトル */
txt_csl(0);
locate(20,1);
txt_color(3);
printf( "------------------------------------------\n");
locate(20,2);
printf( " [select,exe] 1995 program : Y.Gotoh \n");
locate(20,3);
printf( "------------------------------------------\n");
txt_color(7);
/* パラメータの読み込み */
if(argc<2) HELP(); /* パラメータ無しはヘルプ表示 */
for(i=1;i<argc;i++)
{
if(*(argv[i])=='/' || *(argv[i])=='-')
{
tolower( *(argv[i]+1) );
switch(*(argv[i]+1))
{
case 'e':
end_echo=0;
break;
case 'h':
HELP();
break;
case 'b':
strlwr(argv[i]);
for(j=2;j<strlen(argv[i]);j++)
{
dmy=*(argv[i]+j);
if(dmy>=0x61 && dmy<=0x66)
{
pal[j-2]=(10+(dmy-0x30))*15;
}
else pal[j-2]=(atoi(&dmy))*15;
}
GDS_palette(0,pal[0],pal[1],pal[2]);
break;
}
}
else
{
sel_max++;
sel[sel_max]=argv[i];
}
}
if(sel_max<2)
{
txt_color(1);
printf("\n選択肢の数が足りません!!\n");
txt_color(7);
HELP();
}
for(i=0;i<=sel_max;i++)
{
for(j=0;j<strlen(sel[i]);j++) /* アンダーバーをス */
{ /* ペースに変換する。 */
if( *(sel[i]+j)=='_' )
{
*(sel[i]+j)=' ';
}
}
}
ret=select(sel_max); /* 選択ルーチンへ */
if(ret==-1) ret=0; /* エスケープ終了は通常終了にする */
txt_cls();
if(end_echo) /* end_echo が 0 以外ならメッセージ表示 */
{
printf( "[select.exe] Ver 0.08 program : Y.Gotoh\n"
" returned error level [%d]\n",ret);
}
txt_cslon();
exit(ret);
}
/* select : 項目選択用サブ ,*sel[] をグローバルで用意すること */
int select(int sel_max)
{
int sel_no=1,sel_bak=1,ret=0;
char key='\0'; /* とりあえずループさせるために */
locate(20,5);
printf("%s\n",sel[0]); /* メニュータイトル表示 */
select_list(sel_max); /* 一覧表示 */
select_prt(sel_no,sel_bak); /* 初期位置(1)にカーソルを持ってくる */
do
{
key=getch();
key=tolower(key);
/* [↑,F,f]の時 */
if(key=='\x1e' || key=='\x66')
{
sel_bak=sel_no;
sel_no--;
if(sel_no<1) sel_no=sel_max;
select_prt(sel_no,sel_bak);
}
/* [↓,J,j]の時 */
if(key == '\x1f' || key=='\x6a')
{
sel_bak=sel_no;
sel_no++;
if(sel_no>sel_max) sel_no=1;
select_prt(sel_no,sel_bak);
}
/* 各数字(0~9)が押された時 */
if(key >= '\x30' && key <= '\x39')
{
sel_bak=sel_no;
sel_no=(int)key-0x30;
if(sel_no==0) sel_no=10;
if(sel_no>sel_max)
{
sel_no=sel_bak;
}
else
{
select_prt(sel_no,sel_bak);
waitkey(20);
key='\x0d';
}
}
}while(key != '\x0d' && key != '\x1b' && key != '\x20' && key != '\x71');
if(key == '\x0d' || key == '\x20' ) ret=sel_no; /* [space],[ret]なら
選択番号を返す */
if(key == '\x71') ret=0; /* [Q],[q]なら終了(ret=0) */
if(key == '\x1b') ret=-1; /* [esc]なら-1を返す */
return(ret);
}
/* 選択肢一覧表示 */
void select_list(int sel_max)
{
int i;
for(i=1;i<=sel_max;i++)
{
locate(19,i+6);
if(i<10) printf("%1d: %s",i,sel[i]);
else printf("%d: %s",i-10,sel[i]); /* 10は、0と表示する */
}
}
/* 選択カーソル表示ルーチン */
void select_prt(int sel_no,int sel_bak)
{
locate(19,sel_bak+6); /* 黄色の帯を消す */
if(sel_bak<10){
printf("%1d: %s",sel_bak,sel[sel_bak]);
}
else printf("%1d: %s",sel_bak-10,sel[sel_bak]); /* 10は0に */
locate(19,sel_no+6); /* 新しく帯を引く */
if(sel_no<10){
printf("\x1b[7;33m%1d: %s\x1b[0;37m",sel_no,sel[sel_no]);
}
else printf("\x1b[7;33m%1d: %s\x1b[0;37m",sel_no-10,sel[sel_no]);
}
/* サブルーチン */
/* 何かキーを押すか一定時間経つと処理を復帰するサブ */
void waitkey(int wait_time)
{
int i=0;
for(i=0;i<wait_time*10;i++)
{
if( kbhit() != 0) break;
}
}
void HELP(void)
{
printf("%s",help);
exit(0);
}